/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package unidad.matrices;

import DBMS.DataBaseManager;
import admin.permisos.PermisosManager;
import clases.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;

/**
 *
 * @author Gimbet
 */
public class AgregarInformacion extends DispatchAction {

    /*
     * forward name="success" path=""
     */
    private static final String SUCCESS = "success";
    private static final String PAGE = "page";
    private static final String FAILURE = "failure";
    private static final String name = "Agregar Informacion";

//    public ActionForward populate(ActionMapping mapping, ActionForm form,
//            HttpServletRequest request, HttpServletResponse response)
//            throws Exception {
////        Usuario usr = (Usuario) request.getSession().getAttribute("logueado");
////        DataBaseManager dbms = DataBaseManager.getInstance();
////        if (!PermisosManager.validar(this.name, dbms.consultarPermisoAccion(name), usr.getPermiso())) {
////            System.out.println("No tiene permiso");
////            return mapping.findForward(FAILURE);
////        }
//        DataBaseManager dbms = DataBaseManager.getInstance();
////        DataBaseManager dbms = DataBaseManager.getInstance();
//        Matriz matriz = (Matriz) form;
//        matriz.setTipo("Planificacion");
//        matriz = dbms.consultarMatriz(matriz);
//        System.out.println("matrizConsultada" + matriz.getNombre());
//        ArrayList<Celda> filas = matriz.getFilas();
//        for (Columna col : matriz.getColumnas()) {
//            if ("Lista".equals(col.getTipo())) {
//                System.out.println("El tipo de la columna es lista" + col.getIdLista());
//                ArrayList<Lista> listas = dbms.consultarListas();
//                for (Lista lista : listas) {
//                    if (lista.getIdLista() == (col.getIdLista())) {
//                        col.setLista(lista);
//                    }
//                }
//                request.setAttribute(col.getLista().getNombre(), col.getLista().getValores());
//            }
//            if (!"CPYD".equalsIgnoreCase(col.getCpyd())) {
//                System.out.println("Agrego un dato distinto d null");
//                for (Celda fila : filas) {
//                    Dato d;
//                    if ((d = dbms.consultarDato(fila, "Planificacion")) != null) {
//                        fila.setDato(d);
//                        fila.setIdDato(d.getId());
//                    } else {
//                        fila.setDato(new Dato());
//                    }
//                }
//            }
//
//        }
//        request.setAttribute("Matriz", matriz);
//        request.setAttribute("Plan", "plan");
//        return mapping.findForward(PAGE);
//    }

//    public ActionForward populateAjuste(ActionMapping mapping, ActionForm form,
//            HttpServletRequest request, HttpServletResponse response)
//            throws Exception {
////        Usuario usr = (Usuario) request.getSession().getAttribute("logueado");
////        DataBaseManager dbms = DataBaseManager.getInstance();
////        if (!PermisosManager.validar(this.name, dbms.consultarPermisoAccion(name), usr.getPermiso())) {
////            System.out.println("No tiene permiso");
////            return mapping.findForward(FAILURE);
////        }
//        DataBaseManager dbms = DataBaseManager.getInstance();
////        DataBaseManager dbms = DataBaseManager.getInstance();
//        Matriz matriz = (Matriz) form;
//        matriz.setTipo("Ajuste");
//        matriz = dbms.consultarMatriz(matriz);
//        System.out.println("matrizConsultada" + matriz.getNombre());
//        ArrayList<Celda> filas = matriz.getFilas();
//        System.out.println("las filas " + filas.size());
//        for (Columna col : matriz.getColumnas()) {
//            if ("Lista".equals(col.getTipo())) {
//                System.out.println("El tipo de la columna es lista" + col.getIdLista());
//                ArrayList<Lista> listas = dbms.consultarListas();
//                for (Lista lista : listas) {
//                    if (lista.getIdLista() == (col.getIdLista())) {
//                        col.setLista(lista);
//                    }
//                }
//                request.setAttribute(col.getLista().getNombre(), col.getLista().getValores());
//            }
//            if (!"CPYD".equalsIgnoreCase(col.getCpyd())) {
//                System.out.println("Agrego un dato distinto d null");
//                for (Celda fila : filas) {
//                    Dato d;
//                    if ((d = dbms.consultarDato(fila, "Ajuste")) != null) {
//                        fila.setDato(d);
//                        fila.setIdDato(d.getId());
//                    } else {
//                        fila.setDato(new Dato());
//                    }
//                }
//            }
//
//        }
//        request.setAttribute("Matriz", matriz);
//        request.setAttribute("Ajuste", "ajuste");
//        return mapping.findForward(PAGE);
//    }
//
//    public ActionForward populateEjecucion(ActionMapping mapping, ActionForm form,
//            HttpServletRequest request, HttpServletResponse response)
//            throws Exception {
// //        Usuario usr = (Usuario) request.getSession().getAttribute("logueado");
////        DataBaseManager dbms = DataBaseManager.getInstance();
////        if (!PermisosManager.validar(this.name, dbms.consultarPermisoAccion(name), usr.getPermiso())) {
////            System.out.println("No tiene permiso");
////            return mapping.findForward(FAILURE);
////        }
//        DataBaseManager dbms = DataBaseManager.getInstance();
////        DataBaseManager dbms = DataBaseManager.getInstance();
//        Matriz matriz = (Matriz) form;
//        matriz.setTipo("Ejecucion");
//        matriz = dbms.consultarMatriz(matriz);
//        System.out.println("matrizConsultada" + matriz.getNombre());
//        ArrayList<Celda> filas = matriz.getFilas();
//        System.out.println("las filas " + filas.size());
//        for (Columna col : matriz.getColumnas()) {
//            if ("Lista".equals(col.getTipo())) {
//                System.out.println("El tipo de la columna es lista" + col.getIdLista());
//                ArrayList<Lista> listas = dbms.consultarListas();
//                for (Lista lista : listas) {
//                    if (lista.getIdLista() == (col.getIdLista())) {
//                        col.setLista(lista);
//                    }
//                }
//
//                request.setAttribute(col.getLista().getNombre(), col.getLista().getValores());
//            }
//            if (!"CPYD".equalsIgnoreCase(col.getCpyd())) {
//                System.out.println("Agrego un dato distinto d null");
//                for (Celda fila : filas) {
//                    Dato d;
//                    if ((d = dbms.consultarDato(fila, "Ejecucion")) != null) {
//                        fila.setDato(d);
//                        fila.setIdDato(d.getId());
//                    } else {
//                        fila.setDato(new Dato());
//                    }
//                }
//            }
//
//        }
//        request.setAttribute("Matriz", matriz);
//        request.setAttribute("Ejecucion", "ejecucion");
//        return mapping.findForward(PAGE);
//    }

    public ActionForward save(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
//        Usuario usr = (Usuario) request.getSession().getAttribute("logueado");
//        DataBaseManager dbms = DataBaseManager.getInstance();
//        if (!PermisosManager.validar(this.name, dbms.consultarPermisoAccion(name), usr.getPermiso())) {
//            System.out.println("No tiene permiso");
//            return mapping.findForward(FAILURE);
//        }
        DataBaseManager dbms = DataBaseManager.getInstance();
        Matriz m = (Matriz) form;
        System.out.println("Entrando al metodo SAVE" + m.getIdMatriz());
        boolean modif = true;
//        DataBaseManager dbms = DataBaseManager.getInstance();
        m.setColumnas(dbms.consultarColumnas(m));
        System.out.println("Cantidad de filas" + m.getFilas().size());
        System.out.println("Tipo de la matriz " + m.getTipo());
        //Extraer datos mas recientes
        String fechaAct = m.extraerFechaActual();
        
        for (Celda f : m.getFilas()) {
            Dato d = dbms.consultarDato(f, m.getTipo(),m.extraerAno(fechaAct),m.extraerTrimestre(fechaAct));
            //Se agrega por primera vez
            if (d == null) {
                if (m.getTipo().equals("Planificacion")) {
                    if (f.getDato().getValor() != null) {
                        f.getDato().setTipo("Planificacion");
                        f.getDato().setFilaId(f.getIdCelda());
                        boolean bien = dbms.agregarDato(f.getDato());
                        if (bien) {
                            System.out.println("Se guardo un dato");
                            f.setIdDato(f.getDato().getId());
                        }
                        request.setAttribute("Plan", "plan");
                        modif = modif && bien;
                    }
                } else if (m.getTipo().equals("Ajuste")) {
                    f.getDato().setTipo("Ajuste");
                    f.getDato().setFilaId(f.getIdCelda());
                    System.out.println("De que tipo es el f.getDato().incremento" + f.getDato().isIncremento());
                    boolean bien = dbms.agregarDato(f.getDato());
                    if (bien) {
                        System.out.println("Se guardo un dato");
                        f.setIdDato(f.getDato().getId());
                    }
                    modif = modif && bien;
                    request.setAttribute("Ajuste", "ajuste");
                } else if (m.getTipo().equals("Ejecucion")) {
                    //Este hay que verificar si ya se han agregado 3

                    f.getDato().setTipo("Ejecucion");
                    f.getDato().setFilaId(f.getIdCelda());
                    boolean bien = dbms.agregarDato(f.getDato());
                    if (bien) {
                        System.out.println("Se guardo un dato");
                        f.setIdDato(f.getDato().getId());
                    }
                    request.setAttribute("Ejecucion", "ejecucion");
                    modif = modif && bien;
                } else {
                    m.setMensaje("No pudo realizarse su cambio. Intente de nuevo");
                    return mapping.findForward(FAILURE);
                }

            } else {
                //Entonces aqui se realizan los N Ajustes
                if (m.getTipo().equals("Ajuste")) {
                    f.getDato().setTipo("Ajuste");
                    f.getDato().setFilaId(f.getIdCelda());
                    boolean bien = dbms.agregarDato(f.getDato());
                    if (bien) {
                        System.out.println("Se guardo un dato");
                        f.setIdDato(f.getDato().getId());
                    }
                    modif = modif && bien;
                    request.setAttribute("Ajuste", "ajuste");
                }// Aqui se realizan las siguientes Ejecuciones
                else if (m.getTipo().equals("Ejecucion")) {
                    //Este hay que verificar si ya se han agregado 3
                    f.getDato().setTipo("Ejecucion");
                    f.getDato().setFilaId(f.getIdCelda());
                    int cantidad = dbms.cantidadEjecucion(f.getDato());
                    if (cantidad > 3) {
                        System.out.println("No se puede otra ejecucion");
                        m.setMensaje("Ya se han agregado todas las ejecuciones por este año");
                        return mapping.findForward(FAILURE);
                    } else {
                        boolean bien = dbms.agregarDato(f.getDato());
                        if (bien) {
                            System.out.println("Se guardo un dato");
                            f.setIdDato(f.getDato().getId());
                        }
                        request.setAttribute("Ejecucion", "ejecucion");
                        modif = modif && bien;
                    }
                } else { //Si se trata de sobreescribir la planificacion
                  //  System.out.println("No se puede sobreescribir la planificacion");
                //    m.setMensaje("No se puede sobreescribir la planificacion");
                  //  return mapping.findForward(FAILURE);
                     f.getDato().setTipo("Planificacion");
                    f.getDato().setFilaId(f.getIdCelda());
                    boolean bien = dbms.agregarDato(f.getDato());
                    if (bien) {
                        System.out.println("Se guardo un dato");
                        f.setIdDato(f.getDato().getId());
                    }
                    modif = modif && bien;
                    request.setAttribute("Plan", "plan");
                }
            }

            System.out.println("Fila " + f.getNombre() + ", " + f.getIdColumna() + ", " + f.getIdCelda());

        }

        if (modif) {
            m.setMensajeOK("Se guardaron los cambios");
            return mapping.findForward(SUCCESS);
        } else {
            m.setMensaje("No se pudo guardar los cambios");

            return mapping.findForward(FAILURE);
        }
    }
    
    public ActionForward populateAuto(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        System.out.println("Entrando al populate auto");
        DataBaseManager dbms = DataBaseManager.getInstance();
        Recordatorio rec = new Recordatorio();
        Matriz matriz = (Matriz) form;
        int id = (Integer) matriz.getIdMatriz();
        String tal= (String)matriz.getTipo();
        System.out.println("ID ES"+tal);
        rec.setMatriz(id+"");
        rec = dbms.consultarRecordatorioPorMatriz(matriz);
        String tipo = rec.getTipo();
        System.out.println("tipo ES "+tipo);
        String fechaActual = matriz.extraerFechaActual();
        if ("planificacion".equals(tipo)){
        matriz.setTipo("Planificacion");
        }
        if ("ajustes".equals(tipo)){
        matriz.setTipo("Ajuste");
        }
        if ("ejecucion".equals(tipo)){
        matriz.setTipo("Ejecucion");
        }
        Matriz m = dbms.consultarMatriz(matriz);
        System.out.println("matrizConsultada" + m.getNombre());
        ArrayList<Celda> filas = m.getFilas();
        for (Columna col : m.getColumnas()) {
            if ("Lista".equals(col.getTipo())) {
                System.out.println("El tipo de la columna es lista" + col.getIdLista());
                ArrayList<Lista> listas = dbms.consultarListas();
                for (Lista lista : listas) {
                    if (lista.getIdLista() == (col.getIdLista())) {
                        col.setLista(lista);
                    }
                }
                request.setAttribute(col.getLista().getNombre(), col.getLista().getValores());
            }
            if (!"CPYD".equalsIgnoreCase(col.getCpyd())){
                System.out.println("Agrego un dato distinto d null");
                for (Celda fila : filas) {
                    Dato d;
                    if ((d =dbms.consultarDato(fila,"Planificacion",rec.getAno(),"")) != null){
                        fila.setDato(d);
                        fila.setIdDato(d.getId());
                    }
                    else if ((d =dbms.consultarDato(fila,"Ajuste",rec.getAno(),matriz.extraerTrimestre(fechaActual))) != null){
                        fila.setDato(d);
                        fila.setIdDato(d.getId());
                    }
                    else{
                        fila.setDato(new Dato());
                    }
                }
            }
                
        }
        m.setAno(rec.getAno());
        m.setTrimestre(matriz.extraerTrimestre(fechaActual));
        request.setAttribute("Matriz", m);
        if(matriz.getTipo().equals("Planificacion")){
             request.setAttribute("Plan","plan");
        }
        else if (matriz.getTipo().equals("Ajuste")){
            request.setAttribute("Ajuste","ajuste");
        }
        else if (matriz.getTipo().equals("Ejecucion")){
            request.setAttribute("Ejecucion","ejecucion");
        }
        return mapping.findForward(PAGE);
    }    
}
